import numpy as np
from scipy.linalg import svd#同np.linalg.svd(A)分解
# from fractions import Fraction
# np.set_printoptions(formatter={'all':lambda x: str(Fraction(x).limit_denominator())})#设置np.array用分数表示
np.set_printoptions(precision=2)#设置输出的精度-有效数字
np.set_printoptions(suppress=True)#抑制使用对小数的科学记数法
##Python中表示复数的语法：real+imagej。注意：虚部前面必须有系数；
# A = np.array([[1, 0, 1, 1j],
#               [0, 1j, 0, 0], ])
A=np.array([[1,0,0,-1], [0,1,0,1],[0,0,0,0]])
# A = np.array([[1,2],[0,0],[2,4]])

def svd_pos(A):
    print("s-------------------矩阵的奇异值分解A=UΣVT----------------------")

    U, s, VT = svd(A)  # 返回U和VT两个正交矩阵，s为奇异值向量-矩阵的奇异值分解A=UΣVT
    print("U=\n", U)
    print("矩阵A的奇异值为（不足补0）：", s)
    print("VT=\n", VT)
    Sigma = np.zeros(A.shape)
    for i in range(len(s)):
        Sigma[i][i] = s[i]  # 将奇异值向量转化为奇异值矩阵Sigma
    print("矩阵A的奇异对角矩阵Sigma为（和A形状相同）：\n", Sigma)
    print("验证SVD分解:A=UΣVT\n{}=\n{}".format(A, U.dot(Sigma).dot(VT)))  # 验证SVD分解
    print("e-------------------矩阵的奇异值分解A=UΣVT----------------------")

#Ax=b的极小范数最小二乘解为A+b

if __name__ == '__main__':
    svd_pos(A)



